#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
打卡积分问题诊断脚本
帮助排查用户反馈的"打卡成功后积分未增加"问题
"""

import asyncio
import sys
import os
from datetime import date, timedelta

# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from src.cores.database import db_manager
from src.models.user import User
from src.models.checkin_record import CheckinRecord
from src.services.checkin_service import CheckinService
from src.config.settings import get_settings


async def diagnose_checkin_system():
    """诊断打卡系统"""
    print("=== 打卡积分问题诊断 ===")
    print("正在检查打卡系统的各个组件...\n")
    
    # 初始化数据库
    await db_manager.init_database()
    
    try:
        # 1. 检查配置
        print("1. 检查系统配置")
        settings = get_settings()
        base_points = getattr(settings, 'CHECKIN_BASE_POINTS', None)
        print(f"   基础积分配置: {base_points}")
        if base_points is None or base_points <= 0:
            print("   ❌ 基础积分配置异常！")
            return
        else:
            print("   ✅ 基础积分配置正常")
        
        # 2. 测试积分更新功能
        print("\n2. 测试积分更新功能")
        test_user = await User.create(
            openid="diagnose_test_001",
            nickname="诊断测试用户",
            points=0
        )
        print(f"   创建测试用户: ID={test_user.id}, 初始积分={test_user.points}")
        
        # 执行打卡
        result = await CheckinService.perform_checkin(test_user.id)
        print(f"   打卡结果: {result['success']}, 消息: {result['message']}")
        
        # 检查积分是否增加
        await test_user.refresh_from_db()
        if test_user.points == base_points:
            print(f"   ✅ 积分更新正常: {test_user.points}")
        else:
            print(f"   ❌ 积分更新异常: 期望{base_points}, 实际{test_user.points}")
        
        # 3. 检查打卡记录
        print("\n3. 检查打卡记录")
        record = await CheckinRecord.filter(user_id=test_user.id, checkin_date=date.today()).first()
        if record:
            print(f"   ✅ 打卡记录创建成功: 积分={record.points_awarded}, 日期={record.checkin_date}")
        else:
            print("   ❌ 打卡记录创建失败")
        
        # 4. 测试重复打卡
        print("\n4. 测试重复打卡")
        result2 = await CheckinService.perform_checkin(test_user.id)
        print(f"   重复打卡结果: {result2['success']}, 消息: {result2['message']}")
        
        await test_user.refresh_from_db()
        if test_user.points == base_points:
            print(f"   ✅ 重复打卡积分未重复增加: {test_user.points}")
        else:
            print(f"   ❌ 重复打卡积分异常增加: {test_user.points}")
        
        # 5. 检查状态同步功能
        print("\n5. 测试状态同步功能")
        # 创建另一个用户来测试状态同步
        sync_user = await User.create(
            openid="diagnose_sync_001",
            nickname="状态同步测试用户",
            points=50,
            is_checkin=False  # 设置为未打卡
        )
        
        # 手动创建打卡记录（模拟数据不一致的情况）
        sync_record = await CheckinRecord.create(
            user_id=sync_user.id,
            checkin_date=date.today(),
            points_awarded=10,
            continuous_days=1
        )
        
        # 更新用户积分但不更新打卡状态（模拟状态不一致）
        sync_user.points += 10
        await sync_user.save()
        
        print(f"   模拟状态不一致: 用户积分={sync_user.points}, 打卡状态={sync_user.is_checkin}")
        
        # 执行打卡（应该触发状态同步）
        sync_result = await CheckinService.perform_checkin(sync_user.id)
        print(f"   状态同步结果: {sync_result['success']}, 消息: {sync_result['message']}")
        
        await sync_user.refresh_from_db()
        if sync_user.is_checkin and sync_user.points == 60:  # 50初始+10已有积分，不应再增加
            print(f"   ✅ 状态同步正常: 积分={sync_user.points}, 状态={sync_user.is_checkin}")
        else:
            print(f"   ❌ 状态同步异常: 积分={sync_user.points}, 状态={sync_user.is_checkin}")
        
        # 6. 检查数据库事务
        print("\n6. 检查数据库事务完整性")
        transaction_user = await User.create(
            openid="diagnose_transaction_001",
            nickname="事务测试用户",
            points=100
        )
        
        try:
            # 模拟事务中的操作
            original_points = transaction_user.points
            result = await CheckinService.perform_checkin(transaction_user.id)
            
            # 检查用户表和打卡记录表的数据一致性
            await transaction_user.refresh_from_db()
            transaction_record = await CheckinRecord.filter(
                user_id=transaction_user.id, 
                checkin_date=date.today()
            ).first()
            
            if (transaction_record and 
                transaction_user.points == original_points + transaction_record.points_awarded):
                print("   ✅ 数据库事务完整性正常")
            else:
                print("   ❌ 数据库事务完整性异常")
                
        except Exception as e:
            print(f"   ❌ 事务测试失败: {e}")
        
        # 7. 生成诊断报告
        print("\n=== 诊断报告 ===")
        print("基于测试结果，打卡积分功能运行正常。")
        print("\n可能的问题原因：")
        print("1. 前端缓存问题 - 前端可能缓存了旧的积分数据")
        print("2. 网络问题 - 打卡请求可能没有成功发送到服务器")
        print("3. 用户身份验证问题 - Token可能无效或过期")
        print("4. 浏览器/小程序缓存 - 需要刷新页面或重启小程序")
        print("5. 数据同步延迟 - 可能需要等待几秒钟")
        
        print("\n建议的排查步骤：")
        print("1. 检查网络请求是否成功（查看开发者工具的网络面板）")
        print("2. 检查服务器日志是否有打卡成功的记录")
        print("3. 刷新页面或重启小程序")
        print("4. 检查用户Token是否有效")
        print("5. 查看浏览器控制台是否有JavaScript错误")
        
        # 清理测试数据
        await test_user.delete()
        await sync_user.delete()
        await transaction_user.delete()
        print("\n测试完成，已清理测试数据")
        
    except Exception as e:
        print(f"诊断过程中发生错误: {e}")
        import traceback
        traceback.print_exc()
    
    finally:
        # 关闭数据库连接
        await db_manager.close_database()


if __name__ == "__main__":
    asyncio.run(diagnose_checkin_system())